extends CanvasLayer

#信号，通知主游戏开场结束了
signal intro_finished

@onready var label: Label = $Background/Label
@onready var background: ColorRect = $Background
@onready var sfx_type: AudioStreamPlayer2D = $SFX_Type

#配置参数
var full_text: String = "2052年 Hadesca城"
var type_speed: float = 2.0  #打字持续时间（秒）
var wait_time: float = 1.5   #打完字停留多久（秒）
var fade_out_time: float = 1.0 #黑屏淡出时间（秒）

#记录上一帧打了几个字
var _current_visible_chars: int = 0

func _ready() -> void:
	#显示文字内容，但可见度为0
	label.text = full_text
	label.visible_ratio = 0.0
	_current_visible_chars = 0
	#开始播放动画
	start_intro_animation()

func _process(_delta: float) -> void:
	#获取当前 Label 实际显示了多少个字符
	var actual_chars = label.visible_characters
	
	#如果当前显示的字数 和 记录的字数 不一样
	if actual_chars != _current_visible_chars:
		
		#判断一下是变多(打字) 还是 变少(删字)
		var is_typing = actual_chars > _current_visible_chars
		
		#判断要不要发声的逻辑
		var char_to_check = ""
		
		if is_typing:
			#如果是打字，检查最新出现的那个字
			if actual_chars > 0 and actual_chars <= full_text.length():
				char_to_check = full_text[actual_chars - 1]
		else:
			#如果是删字，检查刚刚消失的那个字
			if actual_chars < full_text.length():
				char_to_check = full_text[actual_chars]
		
		#只有当变化的那个字 不是空格 时，才播放声音
		if char_to_check != " ":
			#稍微降低一点删字时的音调，做出一点区别
			if is_typing:
				_play_type_sound(1.0) #正常音调
			else:
				_play_type_sound(0.8) #稍微低沉一点，感觉像退格键
		
		_current_visible_chars = actual_chars

func _play_type_sound(base_pitch: float = 1.0) -> void:
	#在基础音调上微调随机，保持自然感
	sfx_type.pitch_scale = randf_range(base_pitch - 0.1, base_pitch + 0.1)
	sfx_type.play()


func start_intro_animation() -> void:
	#创建打字机效果
	var tween = create_tween()
	tween.tween_property(label, "visible_ratio", 1.0, type_speed)
	
	await tween.finished
	await get_tree().create_timer(wait_time).timeout
		
	var tween_back = create_tween()
	tween_back.tween_property(label, "visible_ratio", 0.0, 1.0)
	await tween_back.finished
	
	
	#动画结束
	intro_finished.emit()
	queue_free()
